3W - 트래픽 미러링 패킷 캡쳐

개요

이번에는 조금 더 심화된 내용으로, 트래픽을 미러링하는 방법을 알아본다.
이 내용만 다루지만, 대신 조금 자세하게 패킷을 캡쳐해서 어떤 식으로 미러링 기능이 동작하는지 볼 것이다.

사전 지식

트래픽 미러링이란

트래픽 미러링은 라우팅될 트래픽을 그대로 복사하여 다른 곳으로도 보내는 기법을 말한다.
복사된 트래픽을 받은 입장에서는 일반적으로 트래픽이 온 것으로 간주하고 응답을 보내지만, 트래픽을 보낸 엔보이는 해당 응답을 무시한다.
새로운 배포 버전을 릴리스할 때 이 방식을 사용하면 실제 사용자의 트래픽을 이용해서 테스트를 하면서도 사용자의 요청은 안정적인 버전으로 그대로 유지시킬 수 있다는 장점이 있다.

실습 진행

미러링 세팅

kubectl apply -f services/catalog/kubernetes/catalog-svc.yaml -n istioinaction
kubectl apply -f services/catalog/kubernetes/catalog-deployment.yaml -n istioinaction
kubectl apply -f services/catalog/kubernetes/catalog-deployment-v2.yaml -n istioinaction
kubectl apply -f ch5/catalog-dest-rule.yaml -n istioinaction
kubectl apply -f ch5/catalog-vs-v1-mesh.yaml -n istioinaction

다시 환경을 세팅한다.

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: catalog
spec:
  hosts:
  - catalog
  gateways:
    - mesh
  http:
  - route:
    - destination:
        host: catalog
        subset: version-v1
      weight: 100
    mirror:
      host: catalog
      subset: version-v2

mirror 필드를 세팅하면 간단하게 트래픽을 미러링할 수 있게 된다.
image.png
webapp 엔보이의 라우팅 설정을 보면 requestMirrorPolicies 가 생긴 것을 볼 수 있다.
image.png
키알리 상으로도 각 버전에 트래픽을 똑같이 보내는 것이 확인된다.
image.png
이때 시각화에서 버튼에서 리퀘스트의 throughput을 보면 v2에는 데이터가 집계되지 않는 것을 확인할 수 있다.

kubectl logs -n istioinaction -l app=catalog -l version=v2 -c catalog -f

image.png
미러 트래픽을 받는 어플리케이션의 로그를 보면 호스트에 -shadow라는 값이 붙는 것을 볼 수 있다.
미러 트래픽을 받는 쪽에 이 정도의 단서를 제공해주긴 하기 때문에 실제 운영 시에는 이걸 활용해 받는 쪽에서 어떻게 처리할지 조금 더 세부적으로 지정할 수 있다.
image.png
그나저나 내가 뭘 또 잘못한 것인지, 미러링되고 있다는 아이콘이 표시되지는 않았다.

미러링 패킷 확인

노드 단에서 확인

apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: default
  namespace: istio-system
spec:
  mtls:
    mode: DISABLE

조금 더 확실하게 보기 위해서 아예 패킷 덤프를 떠보자.
일단 데이터 상태 확인을 위해 mtls를 비활성화한다.

docker exec myk8s-control-plane tcpdump -i any -c 1000 -w /istiobook/capture.pcap 

컨트롤 플레인만 있으므로 패킷을 확인하는 작업이 상대적으로 쉽다.
패킷을 그대로 떠서 호스트로 마운팅 되고 있는 경로에 저장해서 구경해보면..
image.png
http 트래픽만 걸러서 보면 미러링되고 있는 트래픽 정보를 금새 확인할 수 있다.
image.png
참고로 각 파드의 ip도 정확하게 일치한다.
미러링된 요청의 응답을 무시한다는 것이 아예 tcp 연결을 끊어버리는 건가 했는데, 그건 아니고 분명히 응답을 받긴 하고 그걸 사용하지 않는다는 의미로 이해하면 되겠다.
다시 말해 미러링을 한 엔보이는 미러 응답을 자신의 어플리케이션에 돌려보내지 않는다는 말이다.

k run debug --image nicolaka/netshoot -ti -- zsh
curl catalog/items

아예 디버깅 파드를 띄워서 패킷도 캡쳐해봤다.
image.png
내부 패킷 상으로도 정상적으로 미러 응답이 들어온다.

컨테이너 내부에서 확인

이렇게만 보려니 뭔가 아쉽다.
아예 컨테이너 내부에서 일어나는 패킷을 뜯어서 보자.

apiVersion: v1
kind: Pod
metadata:
  name: debug
spec:
  volumes:
    - name: local
      hostPath:
        path: "/istiobook"
  containers:
    - name: debug
      image: nicolaka/netshoot
      command: [sh, -c, "sleep 60d"]
      volumeMounts:
        - mountPath: /istiobook
          name: local
  terminationGracePeriodSeconds: 0

디버깅 파드에 호스트패스 볼륨을 두어 패킷 덤프 파일을 꺼내 볼 수 있게 만들었다.

keti debug -- tcpdump -i any -c 40 -w /istiobook/localhost.pcap
keti debug -- curl catalog/items

이 상태에서 두어번 요청을 보낸다.
해보니까 패킷을 20개 정도만 캡쳐해도 됐을 것이다.
image.png
이제 조금 더 패킷을 자세히 볼 수 있게 됐다!
iptables로 패킷 장난질이 마구 이뤄지다보니 제대로 보기는 힘든데(좀 더 좋게 보는 방법 아시는 분..), 대충 정리하자면 이렇다.

경고!!

tcpdump가 수집되는 시점을 잘못 이해하고 작성된 글이다.
나중에 다시 정리해야할 것 같은데, 15001은 엔보이의 아웃바운드 핸들링 포트이다.

image.png
보다시피 미러링은 이뤄졌으나 실제 프로세스에게 돌려주는 응답은 v1, 즉 이미지 url 정보가 없는 응답 하나 뿐이란 것을 알 수 있다.

결론

미러링 기능을 처음 알게 됐을 때 응답을 버린다고 하길래 나는 아예 iptables에서 드랍을 시켜버리는 게 아닐까 생각했었는데, 조금 더 구체적으로 패킷을 뜯어보고 나서 어떤 식으로 동작하는지 알 수 있었다.
엔보이는 미러링을 해서 트래픽을 전달하고 응답까지 받으나, 그걸 원래 다운스트림으로 돌려주지 않을 뿐이다.

이 미러링과 비슷한 기능으로, 리퀘스트 헤징이라는 것이 있는데, 이것도 다음 글 정도에서 보게 될 것이다.

이전 글, 다음 글

다른 글 보기

이름 index noteType created
1W - 서비스 메시와 이스티오 1 published 2025-04-10
1W - 간단한 장애 상황 구현 후 대응 실습 2 published 2025-04-10
1W - Gateway API를 활용한 설정 3 published 2025-04-10
1W - 네이티브 사이드카 컨테이너 이용 4 published 2025-04-10
2W - 엔보이 5 published 2025-04-19
2W - 인그레스 게이트웨이 실습 6 published 2025-04-17
3W - 버츄얼 서비스를 활용한 기본 트래픽 관리 7 published 2025-04-22
3W - 트래픽 가중치 - flagger와 argo rollout을 이용한 점진적 배포 8 published 2025-04-22
3W - 트래픽 미러링 패킷 캡쳐 9 published 2025-04-22
3W - 서비스 엔트리와 이그레스 게이트웨이 10 published 2025-04-22
3W - 데스티네이션 룰을 활용한 네트워크 복원력 11 published 2025-04-26
3W - 타임아웃, 재시도를 활용한 네트워크 복원력 12 published 2025-04-26
4W - 이스티오 메트릭 확인 13 published 2025-05-03
4W - 이스티오 메트릭 커스텀, 프로메테우스와 그라파나 14 published 2025-05-03
4W - 오픈텔레메트리 기반 트레이싱 예거 시각화, 키알리 시각화 15 published 2025-05-03
4W - 번외 - 트레이싱용 심플 메시 서버 개발 16 published 2025-05-03
5W - 이스티오 mTLS와 SPIFFE 17 published 2025-05-11
5W - 이스티오 JWT 인증 18 published 2025-05-11
5W - 이스티오 인가 정책 설정 19 published 2025-05-11
6W - 이스티오 설정 트러블슈팅 20 published 2025-05-18
6W - 이스티오 컨트롤 플레인 성능 최적화 21 published 2025-05-18
8W - 가상머신 통합하기 22 published 2025-06-01
8W - 엔보이와 iptables 뜯어먹기 23 published 2025-06-01
9W - 앰비언트 모드 구조, 원리 24 published 2025-06-07
9W - 앰비언트 헬름 설치, 각종 리소스 실습 25 published 2025-06-07
7W - 이스티오 메시 스케일링 26 published 2025-06-09
7W - 엔보이 필터를 통한 기능 확장 27 published 2025-06-09

관련 문서

이름 noteType created
Istio Gateway knowledge 2025-04-16
Istio ServiceEntry knowledge 2025-04-17
Istio VirtualService knowledge 2025-04-21
Istio DestinationRule knowledge 2025-04-21
Istio Sidecar knowledge 2025-05-13
Istio ProxyConfig knowledge 2025-05-17
2W - 인그레스 게이트웨이 실습 published 2025-04-17
3W - 버츄얼 서비스를 활용한 기본 트래픽 관리 published 2025-04-22
3W - 트래픽 가중치 - flagger와 argo rollout을 이용한 점진적 배포 published 2025-04-22
3W - 트래픽 미러링 패킷 캡쳐 published 2025-04-22
3W - 서비스 엔트리와 이그레스 게이트웨이 published 2025-04-22
3W - 데스티네이션 룰을 활용한 네트워크 복원력 published 2025-04-26
3W - 타임아웃, 재시도를 활용한 네트워크 복원력 published 2025-04-26
6W - 이스티오 컨트롤 플레인 성능 최적화 published 2025-05-18
7W - 이스티오 메시 스케일링 published 2025-06-09
E-이스티오 컨트롤 플레인 성능 최적화 topic/explain 2025-05-18
E-이스티오 DNS 프록시 동작 topic/explain 2025-06-01
E-이스티오 메시 스케일링 topic/explain 2025-06-08

참고